WorkflowsでCloud Storage用コネクタを用いてオブジェクト一覧を取得してみた

WorkflowsでCloud Storage用コネクタを用いてオブジェクト一覧を取得してみた

WorkflowsのCloud Storage用コネクタを用いてCloud Storageバケット内のファイル一覧を取得する方法を実際のサンプルコードを通して説明しています。
Clock Icon2024.10.05

概要

Workflowsには多くのコネクタがあります。Cloud Run、Pub/Sub、Batch・・・本当にたくさんあるので一覧を見たい方はリファレンスをどうぞ。
https://cloud.google.com/workflows/docs/reference/googleapis

そんなたくさんあるコネクタの中でも今回使ってみるのはCloud Storage用のコネクタです。
https://cloud.google.com/workflows/docs/reference/googleapis/storage/Overview

Cloud Storage用のコネクタを用いると、バケット一覧の取得・メタデータの取得・オブジェクトの削除・バケットの削除などCloud Storageに対する各種操作をWorkflowsから容易に行うことができます。

※コネクタとはGoogle Cloudの各種リソースに対して簡単にアクセスできるように用意されたものです。
call: コネクタの形式で呼び出すことができ、各コネクタごとにさまざまなパラメータの設定が可能です。コネクタを用いるとGoogle Cloudの各種リソースをWorkflowsから呼び出すことが容易になります。各種設定値をYAMLまたはJSONにて記載することでリソース呼び出し時の設定を実装することができます。各コネクタごとにリファレンスも整備されていて、容易にリソース呼び出しをすることができます。

やりたいこと

たくさんあるCloud Storage用コネクタの機能の中でも、今回やりたいことは以下です。

  • WorkflowsでCloud Storage用コネクタを用いてCloud Storageのバケット内のオブジェクト一覧を取得したい。プレフィックス付きで。

とりあえずCloud Storage用コネクタのリファレンスを読み込んでみて以下のコネクタを用いてワークフローを組んでみました。
googleapis.storage.v1.objects.list

https://cloud.google.com/workflows/docs/reference/googleapis/storage/v1/objects/list

リファレンスを見るとバケット名だけが必須項目なのでバケット名を引数にします。

bucket:Required. Name of the bucket in which to look for objects.

とりあえずソースコード全文です

- init:
    assign:
      - bucket_name: "バケット名"
- list:
    call: googleapis.storage.v1.objects.list
    args:
        bucket: ${bucket_name}
    result: listResult
- printList:
    for:
        value: val
        in: ${listResult.items}
        steps:
            - logStep:
                call: sys.log
                args:
                    text: ${val.name}
                    severity: DEBUG

簡潔に解説します。

  1. init ステップ
- init:
    assign:
      - bucket_name: "バケット名"
  • 目的: bucket_nameという変数に、対象とするCloud Storageバケットの名前("バケット名")を代入します。この変数は後続のステップで使用します。
  • ポイント: ワークフロー内で使用する変数を初期化するためのステップです。
  1. list ステップ
- list:
    call: googleapis.storage.v1.objects.list
    args:
        bucket: ${bucket_name}
    result: listResult
  • 目的:Cloud Storage用コネクタを呼び出して、指定されたバケット内のオブジェクトのリストを取得します。
  • 詳細:
    • call: googleapis.storage.v1.objects.listは、Cloud Storageのバケット内のオブジェクトの一覧を取得するコネクタ(API)です。
    • args: bucketbucket_nameの変数を渡して、どのバケットのオブジェクトを取得するか指定します。
    • result: APIの呼び出し結果をlistResultという変数に格納します。この変数には、バケット内のオブジェクトの一覧が含まれます。
  1. printList ステップ
- printList:
    for:
        value: val
        in: ${listResult.items}
        steps:
            - logStep:
                call: sys.log
                args:
                    text: ${val.name}
                    severity: DEBUG
  • 目的: listResult.itemsから取得した各オブジェクトのnameをログに出力します。
  • 詳細:
    • for: listResult.itemsの各要素を反復処理します。value: valで、各オブジェクトをvalという変数に代入します。
    • steps: 各オブジェクトに対して実行するステップを定義します。
    • logStep: sys.logを呼び出して、オブジェクト名をログに出力します。
      • text: ログに出力するテキストを指定します。ここでは、オブジェクトの名前(${val.name})を出力します。
      • severity: ログの重要度をDEBUGに設定します。

補足:オブジェクト一覧を取得してみたところ以下のレスポンスでした。(イメージを掴むためのサンプルです)

{
    "items": [
        {
            "bucket": "****",
            "contentType": "text/plain",
            "crc32c": "AAAAAA==",
            "etag": "****",
            "generation": "1728048465461179",
            "id": "****",
            "kind": "storage#object",
            "md5Hash": "****",
            "mediaLink": "****",
            "metageneration": "1",
            "name": "directory1/test1.txt",
            "selfLink": "****",
            "size": "0",
            "storageClass": "STANDARD",
            "timeCreated": "2024-10-04T13:27:45.464Z",
            "timeStorageClassUpdated": "2024-10-04T13:27:45.464Z",
            "updated": "2024-10-04T13:27:45.464Z"
        }
    ],
    "kind": "storage#objects"
}

リファレンスと上記のレスポンスデータからnameに今回目的とするデータ(オブジェクトのプレフィックス付きファイル名)が取得できると判断してワークフローを組みました。

実行してみる

Cloud Storageのバケットにあらかじめ以下の構成でオブジェクトを作成しました。

/
├── hoge1/
│   └── hoge2/
│       └── test4.txt
├── test1.txt
├── test2.txt
├── test3.txt
└── testtest/
    └── test1.txt

上記の通りにファイル名が出力されていることを期待しています。

実行結果は以下です。

スクリーンショット 2024-10-05 0.11.14

hoge1/hoge2/test4.txttesttest/test1.txtなどプレフィックスもちゃんと取得できていることが確認できました。

コネクタを用いるとシンプルにやりたいことができるのでありがたいですね。

所感

半年ほど前に、以下のブログを書いたときは本コネクタを用いた実装ではありませんでした。
https://dev.classmethod.jp/articles/20240412-workflows-parallel-examine/

このときはCloud Run関数(旧Cloud Functions)を呼び出して、pythonで指定バケットのオブジェクト一覧を取得するということをしていました。
オブジェクト一覧を取得するだけであれば、本コネクタを用いる方がコスト面・実装面で圧倒的に優位だなと考えます(なんでCloud Functionsで実装しちゃったんだろう・・・恥ずかしい・・・)。
何かWorkflowsでやりたいことがあったとき、Google Cloudのサービスに対しての操作であればまずはコネクタを探してみるというのが良いのではないかと考えます。

今回は過去の振り返りも兼ねて書いた記事でもあるのですが、今後面白いコネクタを見つけたらまた記事にしたいなと思います。
それではまた。ナマステー

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.